/**
 * 
 */
package eMdP.gestors;

import java.net.URL;
import java.util.ArrayList;
import java.util.logging.Logger;

import com.jme.math.Vector3f;
import com.jme.renderer.Camera;
import com.jmex.audio.AudioSystem;
import com.jmex.audio.AudioTrack;
import com.jmex.audio.AudioTrack.TrackType;
import com.jmex.audio.MusicTrackQueue.RepeatType;

import eMdP.estats.Partida;

/**
 * @author redribbon
 *
 */
public class GestorMusica {
	private static final Logger logger = Logger.getLogger(Partida.class.getName());
	
	private static AudioSystem audio;
    private static ArrayList<AudioTrack> colisions = new ArrayList<AudioTrack>();
    private static ArrayList<AudioTrack> critsPersonatges = new ArrayList<AudioTrack>();
	
	/**
	 * Métode per inicialitzar la Música perquè quan es cridi al métode Play, estigui tot apunt.
	 * La música és per la partida, ja que li em de passar la Camera, per tal de poder posicionar
	 * el so.
	 * @param cam Li passem la Camera així sap cap on mira i pot posicionar la musica en 3d
	 */
    public static void CrearMusica(Camera cam){
    	 // grab a handle to our audio system.
        audio = AudioSystem.getSystem();
        
        // setup our ear tracker to track the camera's position and orientation.
        audio.getEar().trackOrientation(cam);
        audio.getEar().trackPosition(cam);
        
        // setup a music score for our demo
        AudioTrack music1 = getMusic(GestorMusica.class.getClassLoader().getResource("eMdP/musica/musicaJoc.ogg"));
        music1.setVolume(0.4f);
        audio.getMusicQueue().setRepeatType(RepeatType.ALL);
        audio.getMusicQueue().clearTracks();
        audio.getMusicQueue().addTrack(music1);
        
        
        logger.info("Musica::Musica principal creada amb éxit!");
        
        crearSonsColisions();
        crearCritsPersonatges();
        
        logger.info("GestorMusica::Sons Col·lisions i Crits dels Personatges creats amb éxit!");
    }
    
    /**
     * Inicialitzem l'audio diguent quina música ha de posar mentres estem als menus
     */
    public static void CrearMusicaMenus(){
    	 audio = AudioSystem.getSystem();
    	 
    	// setup a music score for our demo
         AudioTrack music1 = getMusic(GestorMusica.class.getClassLoader().getResource("eMdP/musica/musicaMenus.ogg"));
         music1.setVolume(0.4f);
         audio.getMusicQueue().setRepeatType(RepeatType.ALL);
         audio.getMusicQueue().clearTracks();
         audio.getMusicQueue().addTrack(music1);
         audio.getMusicQueue().play();
         
         
         logger.info("GestorMusica::Musica Menus creada amb éxit!");
    }

    private static void crearSonsColisions(){
    	/* Col·lisio Personatge - Furgo i Paquet - Bustia Mala */
    	AudioTrack soColisio = audio.createAudioTrack(GestorMusica.class.getClassLoader().getResource("eMdP/musica/explosion.wav"), false);
    	soColisio.setMaxAudibleDistance(1000);
    	soColisio.setVolume(0.5f);
    	
    	colisions.add(soColisio);
    	
    	/* Passos del Personatge */
    	soColisio = audio.createAudioTrack(GestorMusica.class.getClassLoader().getResource("eMdP/musica/pasBo.ogg"), false);
    	soColisio.setMaxAudibleDistance(1000);
    	soColisio.setVolume(0.6f);
    	
    	colisions.add(soColisio);
    	
    	logger.info("GestorMusica::So colisions creats amb éxit!");
    }
    
    private static void crearCritsPersonatges(){
    	/* Crit 0 */
    	AudioTrack soCrit = audio.createAudioTrack(GestorMusica.class.getClassLoader().getResource("eMdP/musica/au.ogg"), false);
    	soCrit.setMaxAudibleDistance(1000);
    	soCrit.setVolume(1f);
    	
    	critsPersonatges.add(soCrit);
    	
    	/* Crit 0 */
    	soCrit = audio.createAudioTrack(GestorMusica.class.getClassLoader().getResource("eMdP/musica/tomaquet.ogg"), false);
    	soCrit.setMaxAudibleDistance(1000);
    	soCrit.setVolume(1f);
    	
    	critsPersonatges.add(soCrit);
    	
    	/* Crit 1 */
    	soCrit = audio.createAudioTrack(GestorMusica.class.getClassLoader().getResource("eMdP/musica/tiroPopichel.ogg"), false);
    	soCrit.setMaxAudibleDistance(1000);
    	soCrit.setVolume(1.0f);
    	
    	critsPersonatges.add(soCrit);
    	
    	logger.info("GestorMusica::Crits Personatges creats amb éxit!");
    }
    
    private static AudioTrack getMusic(URL resource) {
        // Create a non-streaming, non-looping, relative sound clip.
        AudioTrack sound = AudioSystem.getSystem().createAudioTrack(resource, true);
        sound.setType(TrackType.MUSIC);
        sound.setRelative(true);
        sound.setTargetVolume(0.7f);
        sound.setLooping(false);
        return sound;
    }
      
    public static void update(){
    	audio.update();
    }
    
    public static void play(){
    	if(!audio.getMusicQueue().isPlaying()){
    		audio.getMusicQueue().play();
    	}
    	logger.info("GestorMusica::Play()");
    }
    
    public static void stop(){
    	if(audio.getMusicQueue().isPlaying())
    		audio.getMusicQueue().stop();
    }
    
    public static void pause(){
    	if(audio.getMusicQueue().isPlaying())
    		audio.getMusicQueue().pause();
    }
    
    public static void reproduirSoColisio(int colisio,Vector3f position){
    	AudioTrack so = colisions.get(colisio);
    	so.setWorldPosition(position);
    	so.play();
    }
    
    public static void reproduirCrit(int numCrit,Vector3f position){
    	AudioTrack so = critsPersonatges.get(numCrit);
    	so.setWorldPosition(position);
    	so.setVolume(1f);
    	so.play();
    }
}
